home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / clang / jcool01.zip / TEST_MAT.C < prev    next >
C/C++ Source or Header  |  1992-08-26  |  14KB  |  396 lines

  1. //
  2. // Copyright (C) 1991 Texas Instruments Incorporated.
  3. // Copyright (C) 1992 General Electric Company.
  4. //
  5. // Permission is granted to any individual or institution to use, copy, modify,
  6. // and distribute this software, provided that this complete copyright and
  7. // permission notice is maintained, intact, in all copies and supporting
  8. // documentation.
  9. //
  10. // Texas Instruments Incorporated, General Electric Company,
  11. // provides this software "as is" without express or implied warranty.
  12. //
  13.  
  14. #include <math.h>                // for fabs
  15. #include <cool/Matrix.h>
  16. #include <cool/Matrix.C>
  17. #include <test.h>
  18.  
  19. void test_int () {
  20.   int result = 0;
  21.   CoolMatrix<int> m0(2,2);
  22.   TEST ("CoolMatrix<int> m0(2,2)", (m0.rows()==2 && m0.columns()==2), TRUE);
  23.   CoolMatrix<int> m1(3,4);
  24.   TEST ("CoolMatrix<int> m1(3,4)", (m1.rows()==3 && m1.columns()==4), TRUE);
  25.   CoolMatrix<int> m2(2,2,2);
  26.   TEST ("CoolMatrix<int> m2(2,2,2)",
  27.     (m2.get(0,0)==2 && m2.get(0,1)==2 && m2.get(1,0)==2 && m2.get(1,1)==2), TRUE);
  28.   TEST ("m0=2", 
  29.     (m0=2,
  30.      (m0.get(0,0)==2 && m0.get(0,1)==2 && m0.get(1,0)==2 && m0.get(1,1)==2)), TRUE);
  31.   TEST ("m0 == m2", (m0 == m2), TRUE);
  32.   TEST ("(m0 == m2)", (m0 == m2), TRUE);
  33.   TEST ("m2.put(1,1,3)", (m2.put(1,1,3),m2.get(1,1)), 3);
  34.   TEST ("m2.get(1,1)", m2.get(1,1), 3);
  35.   TEST ("m0 == m2", (m0 == m2), FALSE);
  36.   TEST ("m0 != m2", (m0 != m2), TRUE);
  37.   TEST ("(m0 == m2)", (m0 == m2), FALSE);
  38.   TEST ("m1.fill(3)",
  39.     (m1.fill(3),
  40.      (m1.get(0,0)==3 && m1.get(1,1)==3 && m1.get(2,2)==3 && m1.get(2,3)==3)), TRUE);
  41.   TEST ("m2.fill(2)",
  42.     (m2.fill(2),
  43.      (m2.get(0,0)==2 && m2.get(0,1)==2 && m2.get(1,0)==2 && m2.get(1,1)==2)), TRUE);
  44.   CoolMatrix<int> m3(1,3,3,1,2,3);
  45.   TEST ("m3(1,3,3,1,2,3)",(m3.get(0,0)==1 && m3.get(0,1)==2 && m3.get(0,2)==3), TRUE);
  46.   CoolMatrix<int> m4(m3);
  47.   TEST ("CoolMatrix<int> m4(m3)", (m3==m4), TRUE);
  48.   TEST ("m0=m2", (m0=m2, (m0==m2)), TRUE);
  49.  
  50.   /// test additions and substractions
  51.   TEST ("m0=m2+3",
  52.     ((m0=m2+3),
  53.      (m0.get(0,0)==5 && m0.get(0,1)==5 && m0.get(1,0)==5 && m0.get(1,1)==5)), TRUE);
  54.   TEST ("m0=3+m2",
  55.     ((m0=3+m2),
  56.      (m0.get(0,0)==5 && m0.get(0,1)==5 && m0.get(1,0)==5 && m0.get(1,1)==5)), TRUE);
  57.   TEST ("m0+=(-3)",
  58.     (m0+=(-3),
  59.      (m0.get(0,0)==2 && m0.get(0,1)==2 && m0.get(1,0)==2 && m0.get(1,1)==2)), TRUE);
  60.   TEST ("m0-=(-3)",
  61.     (m0-=(-3),
  62.      (m0.get(0,0)==5 && m0.get(0,1)==5 && m0.get(1,0)==5 && m0.get(1,1)==5)), TRUE);
  63.   TEST ("m0=m2-3",
  64.     ((m0=m2-3),
  65.      (m0.get(0,0)==-1 && m0.get(0,1)==-1 && m0.get(1,0)==-1 && m0.get(1,1)==-1)), TRUE);
  66.   TEST ("m0=3-m2",
  67.     ((m0=3-m2),
  68.      (m0.get(0,0)==1 && m0.get(0,1)==1 && m0.get(1,0)==1 && m0.get(1,1)==1)), TRUE);
  69.   TEST ("m0= -m2",
  70.     (m0= -m2,
  71.      (m0.get(0,0)==-2 && m0.get(0,1)==-2 && m0.get(1,0)==-2 && m0.get(1,1)==-2)), TRUE);
  72.  
  73.   CoolMatrix<int> m5(2,2);
  74.   m0 = m2;
  75.   TEST ("m5=m0+m2",
  76.     ((m5=m0+m2),
  77.      (m5.get(0,0)==4 && m5.get(0,1)==4 && m5.get(1,0)==4 && m5.get(1,1)==4)), TRUE);
  78.   TEST ("m5=m0-m2",
  79.     ((m5=m0-m2),
  80.      (m5.get(0,0)==0 && m5.get(0,1)==0 && m5.get(1,0)==0 && m5.get(1,1)==0)), TRUE);
  81.   TEST ("m0+=m2", 
  82.     ((m0+=m2),
  83.      (m0.get(0,0)==4 && m0.get(0,1)==4 && m0.get(1,0)==4 && m0.get(1,1)==4)), TRUE);
  84.   TEST ("m0-=m2", 
  85.     ((m0-=m2),
  86.      (m0.get(0,0)==2 && m0.get(0,1)==2 && m0.get(1,0)==2 && m0.get(1,1)==2)), TRUE);
  87.  
  88.   /// test multiplications and divisions
  89.   TEST ("m4=m3*5",
  90.     ((m4=m3*5),
  91.      (m4.get(0,0)==5 && m4.get(0,1)==10 && m4.get(0,2)==15)), TRUE);
  92.   TEST ("m4=5*m3",
  93.     ((m4=5*m3),
  94.      (m4.get(0,0)==5 && m4.get(0,1)==10 && m4.get(0,2)==15)), TRUE);
  95.   TEST ("m3*=5",((m3*=5), (m3== m4)), TRUE);
  96.   TEST ("m4=m3/5",
  97.     ((m4=m3/5),
  98.      (m4.get(0,0)==1 && m4.get(0,1)==2 && m4.get(0,2)==3)), TRUE);
  99.   TEST ("m3/=5", ((m3/=5), (m3==m4)), TRUE);
  100.   
  101.  
  102.   CoolMatrix<int> m6(2,2,4,1,2,3,4);
  103.   TEST ("CoolMatrix<int> m6(2,2,4,1,2,3,4)", m6.get(1,1), 4);
  104.   CoolMatrix<int> m7(2,2,4,5,6,7,8);
  105.   TEST ("CoolMatrix<int> m7(2,2,4,5,6,7,8)", m7.get(1,1), 8);
  106.   TEST ("m5=m6*m7", 
  107.     ((m5=m6*m7),
  108.      (m5.get(0,0)==19 && m5.get(0,1)==22 && m5.get(1,0)==43 && m5.get(1,1)==50)), TRUE);
  109.   TEST ("m6*=m7", 
  110.     ((m6*=m7),
  111.      (m6.get(0,0)==19 && m6.get(0,1)==22 && m6.get(1,0)==43 && m6.get(1,1)==50)), TRUE);
  112.   CoolMatrix<int> c0(2,1,2,1,0);
  113.   CoolMatrix<int> c1;
  114.   TEST ("c1=m6*c0",
  115.     ((c1=m6*c0), 
  116.      c1.rows()==c0.rows() && c1.columns()==c0.columns() && 
  117.      c1.get(0,0)==19 && c1.get(1,0)==43), TRUE);
  118.   CoolMatrix<int> r0(1,2,2,1,0);
  119.   CoolMatrix<int> r1;
  120.   TEST ("r1=r0*m6",
  121.     ((r1=r0*m6), 
  122.      r1.rows()==r0.rows() && r1.columns()==r0.columns() && 
  123.      r1.get(0,0)==19 && r1.get(0,1)==22), TRUE);
  124.   TEST ("r0*=m6",
  125.     ((r0*=m6), r0==r1), TRUE);
  126.   TEST ("m6*=c0",
  127.     ((m6*=c0), c1==m6), TRUE);
  128.   
  129.  
  130.   /// additional tests
  131.   CoolMatrix<int> m(2,2,4,0,-2,2,0);
  132.   m0 = m; m1 = m;
  133.   TEST ("m(i,j)", 
  134.     (m(0,0)==0 && m(0,1)==-2 && m(1,0)==2 && m(1,1)==0), TRUE);
  135.   TEST ("m.transpose()",
  136.     ((m1 = m.transpose()), 
  137.      (m1(0,0)==0 && m1(0,1)==2 && m1(1,0)==-2 && m1(1,1)==0)), TRUE);
  138.   TEST ("m.abs()",
  139.     ((m1 = m.abs()), 
  140.      (m1(0,0)==0 && m1(0,1)==2 && m1(1,0)==2 && m1(1,1)==0)), TRUE);
  141.   TEST ("m.sign()",
  142.     ((m1 = m.sign()),
  143.      (m1(0,0)==0 && m1(0,1)==-1 && m1(1,0)==1 && m1(1,1)==0)), TRUE);
  144.   TEST ("element_product(m,m)",
  145.     ((m1 = element_product(m,m)),
  146.      (m1(0,0)==0 && m1(0,1)==4 && m1(1,0)==4 && m1(1,1)==0)), TRUE);
  147.   TEST ("element_quotient(m,[2])",
  148.     ((m2 = 2),
  149.      (m1 = element_quotient(m,m2)),
  150.      (m1(0,0)==0 && m1(0,1)==-1 && m1(1,0)==1 && m1(1,1)==0)), TRUE);
  151.   TEST ("m.update(m.abs())",
  152.     ((m1 = m.abs()),
  153.      (m2.update(m1)), 
  154.      (m2==m1)), TRUE);
  155.   TEST ("m.extract(1,1,1,1)",
  156.     ((m1 = m.extract(1,1,1,1)),
  157.      (m1.rows()==1 && m1.columns()==1 && m1(0,0)==m(1,1))), TRUE);
  158.   TEST ("m.update([4],1,1)",
  159.     ((m1=4),
  160.      (m.update(m1,1,1)),
  161.      (m(0,0)==0 && m(0,1)==-2 && m(1,0)==2 && m(1,1)==4)), TRUE);
  162.  
  163.   CoolMatrix<int> v (4,1,4,1,0,0,0);
  164.   TEST ("v(i)", 
  165.     (v(0)==v(0,0) && v(0)==v.x() && v.x()==1 &&
  166.      v(1)==v(1,0) && v(1)==v.y() && v.y()==0 &&
  167.      v(2)==v(2,0) && v(2)==v.z() && v.z()==0 &&
  168.      v(3)==v(3,0) && v(3)==v.t() && v.t()==0), TRUE);
  169.   CoolMatrix<int> v1(3,1,3,1,0,0);
  170.   CoolMatrix<int> v2(3,1,3,0,1,0);
  171.   CoolMatrix<int> v3(3,1,3,0,0,1);
  172.   TEST ("dot_product(v1,v2)",
  173.     (dot_product(v1,v2)==0 && dot_product(v1,v3)==0 && dot_product(v2,v3)==0), TRUE);
  174.   v = v3;
  175.   TEST ("4d-v=3d-v", (v.rows()==3 && v.columns()==1 && v==v3), TRUE);
  176.   TEST ("cross_3d(v1,v2)", (v=cross_3d(v1,v2), v == v3), TRUE);
  177.   TEST ("cross_3d(v2,v3)", (v=cross_3d(v2,v3), v == v1), TRUE);
  178.   TEST ("cross_3d(v1,v3)", (v=cross_3d(v1,v3), v == -v2), TRUE);
  179.   CoolMatrix<int> vv(2,1,0);
  180.   v1 = vv; v1.x()=1;
  181.   v2 = vv; v2.y()=1;
  182.   TEST ("cross_2d(v1,v2)", cross_2d(v1,v2)==1, TRUE);
  183. }
  184.  
  185.  
  186. void test_determinant () {
  187.   CoolMatrix<int> m1(2,2,4,1,2,3,4);
  188.   TEST ("m1.determinant", m1.determinant()==-2, TRUE);
  189.   CoolMatrix<int> m2(2,2,4,5,6,7,8);
  190.   TEST ("m2.determinant", m2.determinant()==-2, TRUE);
  191.   TEST ("(m1*m2).determinant", 
  192.     (m1*m2).determinant()==(m1.determinant()*m2.determinant()), TRUE);
  193.   CoolMatrix<int> d0(4,4,16, 1,1,1,1, 1,2,2,2, 1,2,3,3, 1,2,3,4);
  194.   TEST ("d0.determinant", d0.determinant()==7, TRUE);
  195.   CoolMatrix<int> d1(4,4,16, 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1);
  196.   TEST ("d1.determinant", d1.determinant()==1, TRUE);
  197.   CoolMatrix<int> d2(4,4,16, 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16);
  198.   TEST ("d2.determinant", d2.determinant()==0, TRUE);
  199. }
  200.  
  201. Boolean Matrix_double_is_data_equal (const double& d1, const double& d2) {
  202.   return ((fabs(d1 - d2) < 1.0e-12) ? TRUE : FALSE);
  203. }
  204.  
  205. void test_double () {
  206.   double result = 0.0;
  207.   CoolMatrix<double> d0(2,2);
  208.   TEST ("CoolMatrix<double> d0(2,2)", (d0.rows()==2 && d0.columns()==2), TRUE);
  209.   CoolMatrix<double> d1(3,4);
  210.   TEST ("CoolMatrix<double> d1(3,4)", (d1.rows()==3 && d1.columns()==4), TRUE);
  211.   CoolMatrix<double> d2(2,2,2.0);
  212.   TEST ("CoolMatrix<double> d2(2,2,2.0)",
  213.     (d2.get(0,0)==2.0 && d2.get(0,1)==2.0 && d2.get(1,0)==2.0 && d2.get(1,1)==2.0), TRUE);
  214.   TEST ("d0=2.0", (d0=2.0,
  215.            (d0.get(0,0)==2.0 && d0.get(0,1)==2.0 && d0.get(1,0)==2.0 && d0.get(1,1)==2.0)), TRUE);
  216.   TEST ("d0.set_compare", 
  217.     (d0.set_compare(&Matrix_double_is_data_equal), TRUE), TRUE);
  218.   TEST ("d0 == d2", (d0 == d2), TRUE);
  219.   TEST ("(d0 == d2)", (d0==d2), TRUE);
  220.   TEST ("d2.put(1,1,3.0)", (d2.put(1,1,3.0),d2.get(1,1)), 3.0);
  221.   TEST ("d2.get(1,1)", d2.get(1,1), 3.0);
  222.   TEST ("d0 == d2", (d0 == d2), FALSE);
  223.   TEST ("d0 != d2", (d0 != d2), TRUE);
  224.   TEST ("(d0 == d2)", (d0==d2), FALSE);
  225.   TEST ("d1.fill(3.0)",
  226.     (d1.fill(3.0),
  227.      (d1.get(0,0)==3.0 && d1.get(1,1)==3.0 && d1.get(2,2)==3.0 && d1.get(2,3)==3.0)), TRUE);
  228.   TEST ("d2.fill(3.0)",
  229.     (d2.fill(2.0),
  230.      (d2.get(0,0)==2.0 && d2.get(0,1)==2.0 && d2.get(1,0)==2.0 && d2.get(1,1)==2.0)), TRUE);
  231.   CoolMatrix<double> d3(1,3,3,1.0,2.0,3.0);
  232.   TEST ("d3(1,3,3,1.0,2.0,3.0)",(d3.get(0,0)==1.0 && d3.get(0,1)==2.0 && d3.get(0,2)==3.0), TRUE);
  233.   CoolMatrix<double> d4(d3);
  234.   TEST ("CoolMatrix<double> d4(d3)", (d3 == d4), TRUE);
  235.   TEST ("d0=d2", (d0=d2,  (d0==d2)), TRUE);
  236.   TEST ("d0=d2+3.0",
  237.     ((d0=d2+3.0),
  238.      (d0.get(0,0)==5.0 && d0.get(0,1)==5.0 && d0.get(1,0)==5.0 && d0.get(1,1)==5.0)), TRUE);
  239.   TEST ("d0+=(-3.0)",
  240.     (d0+=(-3.0),
  241.      (d0.get(0,0)==2.0 && d0.get(0,1)==2.0 && d0.get(1,0)==2.0 && d0.get(1,1)==2.0)), TRUE);
  242.   CoolMatrix<double> d5(2,2);
  243.   TEST ("d5=d0+d2",
  244.     ((d5=d0+d2),
  245.      (d5.get(0,0)==4.0 && d5.get(0,1)==4.0 && d5.get(1,0)==4.0 && d5.get(1,1)==4.0)), TRUE);
  246.   TEST ("d0+=d2", 
  247.     ((d0+=d2),
  248.      (d0.get(0,0)==4.0 && d0.get(0,1)==4.0 && d0.get(1,0)==4.0 && d0.get(1,1)==4.0)), TRUE);
  249.   TEST ("d4=d3*5.0",((d4=d3*5.0),(d4.get(0,0)==5.0 && d4.get(0,1)==10.0 && d4.get(0,2)==15.0)), TRUE);
  250.   TEST ("d3*=5.0",((d3*=5.0),  (d3== d4)), TRUE);
  251.   CoolMatrix<double> d6(2,2,4,1.0,2.0,3.0,4.0);
  252.   TEST ("CoolMatrix<double> d6(2,2,4,1.0,2.0,3.0,4.0)", d6.get(1,1), 4.0);
  253.   CoolMatrix<double> d7(2,2,4,5.0,6.0,7.0,8.0);
  254.   TEST ("CoolMatrix<double> d7(2,2,4,5.0,6.0,7.0,8.0)", d7.get(1,1), 8.0);
  255.   TEST ("d5=d6*d7", ((d5=d6*d7),
  256.              (d5.get(0,0)==19.0 && d5.get(0,1)==22.0 && d5.get(1,0)==43.0 && d5.get(1,1)==50.0)), TRUE);
  257.   TEST ("d6*=d7", ((d6*=d7),
  258.            (d6.get(0,0)==19.0 && d6.get(0,1)==22.0 && d6.get(1,0)==43.0 && d6.get(1,1)==50.0)), TRUE); 
  259.   cout << d6 << '=' << &d6 << endl;
  260.   TEST ("<<", TRUE, TRUE);
  261. }
  262.  
  263. void test_envelope () {
  264.   CoolMatrix<int> m0(2,2,0), m1(m0), m2(m0), m3(m0), m4(m0);
  265.   m1 = 1; m2 = 2; m3 = 3; m4 = 4;
  266.   m0 = m1 + m2 + m3 + m4;
  267.   TEST ("operator+", (m0(0,0)==10 && m0(0,1)==10 && m0(1,0)==10 && m0(1,1)==10),
  268.     TRUE);
  269.   m0 = m1 * m2 * m3 * m4;
  270.   TEST ("operator*", (m0(0,0)==192 && m0(0,1)==192 && m0(1,0)==192 && m0(1,1)==192),
  271.     TRUE);
  272. }
  273.  
  274. void test_conversion () {
  275.   int i, j, d;
  276.   Boolean check;
  277.   {
  278.     // convert from a CoolMatrix to a block array:
  279.     CoolMatrix<int> m1 (4,3,12, 1,2,3, 4,5,6, 7,8,9, 10,11,12);
  280.     const int* data = m1.data_block();
  281.     {
  282.       check = TRUE;
  283.       for (d = 0; d < 12; d++)
  284.     if (data[d] != d+1)
  285.       check = FALSE;
  286.     }
  287.     TEST ("(const int*) m.data_block", check, TRUE);
  288.     
  289.     typedef int block [4][3];
  290.     block& m2 = *((block*) data);
  291.     {
  292.       check = TRUE;
  293.       for (i = 0; i < 4; i++) 
  294.     for (j = 0; j < 3; j++) 
  295.       if (m1(i,j) != m2[i][j])
  296.         check = FALSE;
  297.     }
  298.     TEST ("matrix(i,j)==block[i][j]", check, TRUE);
  299.     
  300.     // convert from a block array to a CoolMatrix:
  301.     block b1;
  302.     for (i=0; i<4; i++) 
  303.       for (j=0; j<3; j++)
  304.     b1[i][j] = i*3+j;
  305.     data = ((const int*) b1);            // & in ((const int*) &b1) 
  306.     {                        // is not needed.
  307.       check = TRUE;
  308.       for (d = 0; d < 12; d++)
  309.     if (data[d] != d)
  310.       check = FALSE;
  311.     }
  312.     TEST ("(const int*) block", check, TRUE);
  313.     CoolMatrix<int> b2(4, 3, data);
  314.     { 
  315.       check = TRUE;
  316.       for (i = 0; i < 4; i++) 
  317.     for (j = 0; j < 3; j++) 
  318.       if (b1[i][j] != b2(i,j))
  319.         check = FALSE;
  320.     }
  321.     TEST ("block[i][j]==matrix(i,j)", check, TRUE);
  322.   }
  323.   {
  324.     // convert from a CoolMatrix to a block array:
  325.     CoolMatrix<double> m1 (4,3,12, 
  326.                1.0,2.0,3.0, 4.0,5.0,6.0, 
  327.                7.0,8.0,9.0, 10.0,11.0,12.0);
  328.     const double* data = m1.data_block();
  329.     {
  330.       check = TRUE;
  331.       for (d = 0; d < 12; d++)
  332.     if (data[d] != d+1)
  333.       check = FALSE;
  334.     }
  335.     TEST ("(const double*) m.data_block", check, TRUE);
  336.     
  337.     typedef double block [4][3];
  338.     block& m2 = *((block*) data);
  339.     {
  340.       check = TRUE;
  341.       for (i = 0; i < 4; i++) 
  342.     for (j = 0; j < 3; j++) 
  343.       if (m1(i,j) != m2[i][j])
  344.         check = FALSE;
  345.     }
  346.     TEST ("matrix(i,j)==block[i][j]", check, TRUE);
  347.     
  348.     // convert from a block array to a CoolMatrix:
  349.     block b1;
  350.     for (i=0; i<4; i++) 
  351.       for (j=0; j<3; j++)
  352.     b1[i][j] = i*3+j;
  353.     data = ((const double*) b1);        // & in ((const double*) &b1)
  354.     {                        // is not needed
  355.       check = TRUE;
  356.       for (d = 0; d < 12; d++)
  357.     if (data[d] != d)
  358.       check = FALSE;
  359.     }
  360.     TEST ("(const double*) block", check, TRUE);
  361.     CoolMatrix<double> b2(4, 3, data);
  362.     { 
  363.       check = TRUE;
  364.     for (i = 0; i < 4; i++) 
  365.       for (j = 0; j < 3; j++) 
  366.     if (b1[i][j] != b2(i,j))
  367.       check = FALSE;
  368.     }
  369.     TEST ("block[i][j]==matrix(i,j)", check, TRUE);
  370.   }
  371. }
  372.  
  373. void test_leak () {                // use top4.1 to watch memory usage.
  374.   for (;;) {                    // remember to kill process.
  375.     test_int ();
  376.     test_double ();
  377.     test_envelope ();
  378.     test_determinant ();
  379.     test_conversion ();
  380.   }
  381. }
  382.  
  383. int main (void) {
  384.   START("CoolMatrix");
  385.   test_int ();
  386.   test_double ();
  387.   test_envelope ();
  388.   test_determinant ();
  389.   test_conversion ();
  390. #if LEAK
  391.   test_leak ();
  392. #endif
  393.   SUMMARY();
  394.     return 0;
  395. }
  396.